GtkMenuButton: explicitly protect against recursion
authorCarlos Garnacho <carlosg@gnome.org>
Thu, 23 Jul 2015 12:26:25 +0000 (14:26 +0200)
committerMatthias Clasen <mclasen@redhat.com>
Fri, 31 Jul 2015 02:37:53 +0000 (22:37 -0400)
The visibility toggling happening on ::click() relied implicitly
on the popover animation, but breaks on disabled animations. The
recursion happening within gtk_toggle_button_set_active() (which
triggers ::clicked when changing state) makes this vfunc to run
again, inverting the visibility of the popover in result.

Fix this by explicitly checking about recursion, we want the
button to be toggled to the right state, but we don't want the
callback running again.

https://bugzilla.gnome.org/show_bug.cgi?id=752577

gtk/gtkmenubutton.c

index 2126087dd4c10c883a0826597830afcd4ce624f8..fad5cb643254e7f4c2b5b57e252b7975ffe02bf9 100644 (file)
@@ -133,6 +133,7 @@ struct _GtkMenuButtonPrivate
   GtkArrowType arrow_type;
   gboolean use_popover;
   guint press_handled : 1;
+  guint in_click : 1;
 };
 
 enum
@@ -429,6 +430,11 @@ gtk_menu_button_clicked (GtkButton *button)
   GtkMenuButtonPrivate *priv = menu_button->priv;
   gboolean active;
 
+  if (priv->in_click)
+    return;
+
+  priv->in_click = TRUE;
+
   if (priv->menu)
     {
       active = !gtk_widget_get_visible (priv->menu);
@@ -464,6 +470,7 @@ gtk_menu_button_clicked (GtkButton *button)
 
   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), active);
   gtk_toggle_button_toggled (GTK_TOGGLE_BUTTON (button));
+  priv->in_click = FALSE;
 }
 
 static void